XML en .NET Core
Home

XML en .NET Core

XML en .NET Core

Xml of Extensible Markup Language is een manier om data door te geven tussen computerprogrammas. Xml is een meta-taal. Dit is een taal die een andere taal omschrijft. Xml is een basis om afspraken te maken over de manier waarop men de data zal omschrijven en interpreteren. Met xml kan men nieuwe talen definiëren. XML zelf is al een eenvoudigere versie van SGML en ook platform onafhankelijk. Eenzelfde XML is dus bruikbaar op verschillende computers en besturingssystemen.

Een van de redenen waarom XML zo populair is , is omdat de basis heel gemakkelijk aan te leren is. Alleen is het zo dat men als gebruiker met alleen maar XML, niet veel kan doen. XML wordt normaal gezien gelezen en geschreven door computers.

Doestelling

Na deze les kan je XML manipuleren in C#.

Als voorbeeld nemen we de Postcodes. We lezen de postcodes in uit het csv bestand in een array en we serialiseren vervolgens de array als XML. Tenslotte lezen we het XML bestand in en zetten de XML om naar een List.

System.Xml.XmlSerrializer installeren

  1. MSDN documentatie
    1. theorie serialisatie
    2. XmlSerializer Class
  2. Ik ga ervan uit dat je op je lokale computer een werkmap voor de module hebt gemaakt (in de trant van Programmeren5-15227 of Programmeren3-15268 of gewoon Programmeren3). Hangt ervan af in welke module dit toegepast wordt.
    Werkmap op je lokale computer
    Werkmap op je lokale computer
  3. Ik ga er ook vanuit dat je .NET Core reeds geactiveerd hebt. Indien niet ga je eerst naar Programmeren in Visual Studio.
  4. Daarnaast heb je reeds een project learning aangemaakt, indien niet ga je naar Oefening OO code schrijven. Daar zie je hoe je een learning project creëert.
  5. Het System.Xml.XmlSerializer pakket installeren. Hoe je dat doet vind je op de System.Xml.XmlSerializer pagina. We gaan de serializer installeren met behulp van NuGet.
    1. De NuGet Package Manager Console openen:
      Open Package Manager Console
      Open Package Manager Console
    2. De serializer installeren met de instructie Install-Package System.Xml.XmlSerializer -Version 4.3.0:
      Visual Studio System.Xml.XmlSerializer package toegevoegd
      Visual Studio System.Xml.XmlSerializer package toegevoegd
  6. Volgens de documentatie kan je geen List of ArrayList serialiseren, alleen gewone arrays (zie XmlSerializer Class). Daarvoor voegen we de methode GetArray toe. Hoe je dit klassenbestand creëert leer je in CSV bestand deserialiseren naar een generieke lijst:
    public static Postcode[] GetPostcodeArray()
    {
        string[] lines = LeesUitCsvBestand().Split('\n');
        Postcode[] postcodes = new Postcode[lines.Length];
        int i = 0;
        foreach (string s in lines)
        {
            if (s.Length > 0)
            {
                postcodes[i++] = ToObject(s);
            }
        }
        return postcodes;
    }
  7. Voeg de methode SerializeCsvToXml toe aan de klasse TryOut in de namespace DotNetCore.Learning in het klassenbestand met de naam Learning.cs.om een bestand te genereren met de postcodes in XML formaat:
    public static void SerializeCsvToXml()
    {
        XmlSerializer serializer = new XmlSerializer(typeof(Postcode[]));
        Postcode postcode = new Postcode();
        TextWriter writer = new StreamWriter(@"Data/Postcode.xml");
        //De serializer werkt niet voor een generieke lijst en ook niet voor ArrayList
        Postcode[] postcodes = GetPostcodeArray();
        serializer.Serialize(writer, postcodes);
        writer.Close();
    }

    In de map Data staat nu een bestand met de naam Postcodes.xml:

    Content Postcodes.xml
    Content Postcodes.xml
  8. We maken nu een presentation methode om de postcodes in de console te tonen. Voeg de volgende methode toe aan de klasse TryOut in de namespace DotNetCore.Learning in het bestand met de naam Learning.cs:
    public static void ListPostcodes(List<Postcode> list)
    {
        foreach (Postcode postcode in list)
        {
            // One of the most versatile and useful additions to the C# language in version 6
            // is the null conditional operator ?.Post           
            Console.WriteLine("{0}\t{1}\t{2}\t{3}\t{4}",
                postcode?.Code,
                postcode?.Plaats,
                postcode?.Provincie,
                postcode?.Localite,
                postcode?.Province);
        }
    }
  9. En nu nog een methode om de postcodes om te zetten van XML formaat naar een List met Postcode objecten. Voeg de methode GetPostcodeListFromXml toe aan de klasse TryOut in de namespace DotNetCore.Learning in het klassenbestand met de naam Learning.cs:
    public static List<Postcode> GetPostcodeListFromXml()
    {
        XmlSerializer serializer = new XmlSerializer(typeof(Postcode[]));
        Postcode postcode = new Postcode();
        StreamReader file = new System.IO.StreamReader(@"Data/Postcode.xml");
        Postcode[] postcodes = (Postcode[])serializer.Deserialize(file);
        file.Close();
        // array converteren naar List
        return new List<Postcode>(postcodes);
    }
  10. Probeer de methoden uit in de Main functie van Program.cs:
    using System;
    
    namespace DotNetCore.Learning
    {
        class Program
        {
    
            static void Main(string[] args)
            {
                TryOut.SerializeCsvToXml();
                TryOut.ListPostcodes(TryOut.GetPostcodeListFromXml());
                Console.ReadKey();
            }
        }
    }
  11. En dat is het resultaat:
    Visual Studio XML Serializer Test Result
    Visual Studio XML Deserializer Test Result
  12. Wijzigingen opslaan in de repo op Bitbucket

    Er rest ons alleen nog de wijzigingen te sturen naar onze repo op Cloud9. Let erop dat ik in de voorbeelden een andere naam kan gebruiken. Ik gebruik dit lesmateriaal immers in meerdere modules.

    Daarvoor voeren we de volgende stappen uit:

    1. ga naar het commando venster of naar PowerShell;
    2. ga naar de de map waar je project staat, we pushen immers het hele project en niet alleen de dotnetcore map (de naam van de map hangt af van de module die je aan het volgen bent):
      cd "C:\Users\jefin\OneDrive\school 2017-2018\Programmeren3-15268"
    3. Voeg de volgende mappen en bestand toe in het .gitignore bestand:
    4. check de gewijzigde bestanden:
      git status
    5. we merken dat er VS nieuwe bestanden heeft gemaakt die we niet in de repo willen, dus wijzigen we het .gitignore bestand;
      dotnetcore/hwapp/bin/
      dotnetcore/hwapp/obj/
      dotnetcore/adodotnet/adodotnet/obj/
      dotnetcore/adodotnet/adodotnet/bin/Debug/
      dotnetcore/adodotnet/adodotnet/obj/Debug/
      dotnetcore/adodotnet/adodotnet.sln
      dotnetcore/adodotnet/adodotnet/.vs/
      dotnetcore/.vs/
      dotnetcore/learning/bin/
      dotnetcore/learning/obj/
      dotnetcore/*.sln
      
    6. met git rm -rf --cached . activeren we het nieuwe .gitignore bestand (VS verzameld automatisch bestanden)
    7. opnieuw git status
    8. verzamel de gewijzigde bestanden op de verzamelplaats:
      git add --all
    9. check welke bestanden verzameld zijn:
      git status
    10. leg ze neer en voeg er commentaar aan toe:
      git commit -m "System.Xml.XmlSerrializer toegevoegd en uitgetest."
    11. verifiëer als je al een alias voor Bitbucket url hebt toegevoegd:
      git remote -v
    12. Indien nodig voeg je een alias toe voor de Bitbucket url:
      git remote add origin https://JefInghelbrecht@bitbucket.org/JefInghelbrecht/programmeren-3.git
    13. verstuur de neergelegde wijzigingen naar BitBucket:
      git push -u origin master
    14. Als je repo's niet meer gesynchroniseerd zijn omdat dit de eerste keer is dag je dit doet, kan je de push forceren met de -f flag:
      git push -f origin master.
    15. check op Bitbucket als de repo bijgewerkt is

JI
2020-10-23 09:00:17